package com.hedl.practice.diyJava.reflex.construction_method_access;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Construction {
    /**
     * 通过Class实例获取Constructor的方法如下：
     *          getConstructor(Class...)：获取某个public的Constructor；
     *          getDeclaredConstructor(Class...)：获取某个Constructor；
     *          getConstructors()：获取所有public的Constructor；
     *          getDeclaredConstructors()：获取所有Constructor。
     *          注意Constructor总是当前类定义的构造方法，和父类无关，因此不存在多态的问题;
     * 调用非public的Constructor时，必须首先通过setAccessible(true)设置允许访问。setAccessible(true)可能会失败。
     * @param args
     */
    public static void main(String[] args) {
        try {
            //先实例化对象，在获取构造方法(参数类型)
            Constructor cons = Integer.class.getConstructor(int.class);
            //在new实例方法
            Integer i = (Integer) cons.newInstance(123);
            System.out.println("i1--->"+i);

            Constructor cons1 = Integer.class.getConstructor(String.class);
            Integer i1 = (Integer) cons1.newInstance("456");
            System.out.println("i1--->"+i1);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
